package com.ruoyi.common.office;

import com.ruoyi.common.utils.SimilarFilesFinderUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hslf.usermodel.HSLFSlide;
import org.apache.poi.hslf.usermodel.HSLFSlideShow;
import org.apache.poi.xslf.usermodel.*;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
@Slf4j
public class ConvertPPTXFromRemoteUrl {

    // 中文字体名称（确保运行环境存在该字体，如 "SimSun" 宋体、"Microsoft YaHei" 微软雅黑）
    private static final String CHINESE_FONT_NAME = "SimSun";

    private static final String filePrefix = "http://101.43.194.26:84/prod-api/profile/ppt/";

    /**
     * 从远程 URL 解析 PPT/PPTX 并生成图片（支持中文）
     * @param pptUrl 远程 PPT URL（.ppt 或 .pptx）
     * @param outputDir 图片输出目录
     * @param format 图片格式（如 "png"）
     * @param timeout 超时时间（毫秒）
     */
    public static ArrayList<String> convert(String pptUrl, String outputDir, String format, int timeout,String fileName) throws Exception {
        // 创建输出目录
        File dir = new File(outputDir);
        if (!dir.exists()) {
            boolean mkdir = dir.mkdirs();
            if (!mkdir){
                return null;
            }
        }

        String firstFileName = outputDir + File.separator + fileName + "_";
        File file = new File(firstFileName + "1." + format);
        log.info("判断文件是否存在:{}",file.getName());
        if (file.exists()){
            log.info("文件名: {} 已存在,查找匹配的文件名: {}",file.getName(),fileName);
            return SimilarFilesFinderUtil.findPathByPrefix(outputDir, fileName);
        }

        ArrayList<String> list;

        // 下载远程 PPT 输入流
        try (InputStream is = getRemoteInputStream(pptUrl, timeout)) {
            // 判断文件格式并解析
            if (pptUrl.toLowerCase().endsWith(".pptx")) {
                list = convertPptx(is, outputDir, format,fileName);
            } else if (pptUrl.toLowerCase().endsWith(".ppt")) {
                list =  convertPpt(is, outputDir, format,fileName);
            } else {
                throw new IllegalArgumentException("不支持的文件格式：" + pptUrl);
            }
        }

        return list;
    }

    /**
     * 处理 .pptx 格式
     */
    private static ArrayList<String> convertPptx(InputStream is, String outputDir, String format,String fileName) throws Exception {
        try (XMLSlideShow ppt = new XMLSlideShow(is)) {
            Dimension pageSize = ppt.getPageSize();
            List<XSLFSlide> slides = ppt.getSlides();

            ArrayList<String> list = new ArrayList<>();
            String firstFileName = outputDir + File.separator + fileName + "_";

            for (int i = 0; i < slides.size(); i++) {
                XSLFSlide slide = slides.get(i);
                // 替换幻灯片中所有文本的字体为中文字体
                replaceFontForPptx(slide);

                // 渲染幻灯片为图片
                BufferedImage image = new BufferedImage(
                        pageSize.width, pageSize.height, BufferedImage.TYPE_INT_RGB
                );
                Graphics2D g = image.createGraphics();
                // 设置绘图环境的默认字体（防止默认字体缺失）
                g.setFont(new Font(CHINESE_FONT_NAME, Font.PLAIN, 12));
                g.setPaint(Color.WHITE);
                g.fill(new Rectangle2D.Float(0, 0, pageSize.width, pageSize.height));

                slide.draw(g); // 绘制幻灯片
                g.dispose();

                // 保存图片
                String imagePath = firstFileName + (i + 1) + "." + format;
                ImageIO.write(image, format, new File(imagePath));

                list.add(filePrefix + imagePath.substring(imagePath.lastIndexOf("/") + 1));

                log.info("保存图片:{} 在路径:{}", imagePath, outputDir);

            }
            return list;
        }
    }

    /**
     * 处理 .ppt 格式
     */
    private static ArrayList<String> convertPpt(InputStream is, String outputDir, String format,String fileName) throws Exception {
        try (HSLFSlideShow ppt = new HSLFSlideShow(is)) {
            Dimension pageSize = ppt.getPageSize();
            List<HSLFSlide> slides = ppt.getSlides();

            ArrayList<String> list = new ArrayList<>();
            String firstFileName = outputDir + File.separator + fileName + "_";

            for (int i = 0; i < slides.size(); i++) {
                HSLFSlide slide = slides.get(i);
                // 替换 .ppt 文本字体
                replaceFontForPpt(slide);

                BufferedImage image = new BufferedImage(
                        pageSize.width, pageSize.height, BufferedImage.TYPE_INT_RGB
                );
                Graphics2D g = image.createGraphics();
                g.setFont(new Font(CHINESE_FONT_NAME, Font.PLAIN, 12));
                g.setPaint(Color.WHITE);
                g.fill(new Rectangle2D.Float(0, 0, pageSize.width, pageSize.height));

                slide.draw(g);
                g.dispose();

                String imagePath = firstFileName + (i + 1) + "." + format;
                ImageIO.write(image, format, new File(imagePath));

                list.add(filePrefix + imagePath.substring(imagePath.lastIndexOf("/") + 1));

                log.info("保存图片:{} 在路径:{}", imagePath, outputDir);

            }
            return list;
        }
    }

    /**
     * 替换 .pptx 幻灯片中所有文本的字体为中文字体
     */
    public static void replaceFontForPptx(XSLFSlide slide) {
        // 遍历幻灯片中的所有形状
        for (XSLFShape shape : slide.getShapes()) {
            // 过滤出文本形状（文本框、占位符等）
            if (shape instanceof XSLFTextShape) {
                XSLFTextShape textShape = (XSLFTextShape) shape;
                // 遍历文本形状中的所有段落
                for (XSLFTextParagraph paragraph : textShape.getTextParagraphs()) {
                    // 遍历段落中的所有文本run
                    for (XSLFTextRun run : paragraph.getTextRuns()) {
                        // 获取当前文本run的字体
                        run.setFontFamily(CHINESE_FONT_NAME); // 设置新字体
                        // run.setFontName(targetFont, FontGroup.EAST_ASIAN); // 中文字体
                    }
                }
            }
        }
    }

    /**
     * 替换 .ppt 幻灯片中所有文本的字体为中文字体
     */
    private static void replaceFontForPpt(HSLFSlide slide) {

    }

    /**
     * 获取远程 URL 的输入流（带超时）
     */
    private static InputStream getRemoteInputStream(String url, int timeout) throws IOException {
        URLConnection conn = new URL(url).openConnection();
        conn.setConnectTimeout(timeout);
        conn.setReadTimeout(timeout);
        return conn.getInputStream();
    }
}
